#include "ledbuz_rte.h"
#include "rte.h"


/**
 * @brief 初始化LED和蜂鸣器
 * 
 * 该函数初始化了LED和蜂鸣器的相关GPIO引脚，确保蜂鸣器初始状态为关闭。
 * 不接受任何参数，也不返回任何值。
 */
void Led_buzz_init(void)
{
    // 设置GPIOD的PD15引脚和GPIOC的PC6引脚为低电平，初始化LED
    RTE_GPIO_PIN_SET_LEVEL(GPIOD,OUT8_PD15_Pin,GPIO_PIN_RESET);
    RTE_GPIO_PIN_SET_LEVEL(GPIOC,OUT7_PC6_Pin,GPIO_PIN_RESET);
    // 关闭GPIOD的PD1引脚，即关闭蜂鸣器
    HAL_GPIO_WritePin(GPIOD, OUT6_PD1_Pin, GPIO_PIN_RESET);
}

/*
 * 函数介绍: 蜂鸣器响一声
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void Buzzer_Sound(void)
{
    static uint32_t Record_send_time = 0;

    HAL_GPIO_WritePin(GPIOD, OUT6_PD1_Pin, GPIO_PIN_SET); // 开启蜂鸣器
    Record_send_time = RTE_GET_TIMER();                   /*记录_开始时间*/
    while (no_timeout == RTE_TIMEOUT_JUDGMENT(Record_send_time, BUZZER_DEL))
    {
    };
    HAL_GPIO_WritePin(GPIOD, OUT6_PD1_Pin, GPIO_PIN_RESET); // 关闭蜂鸣器
}

/*
 * 函数介绍: 蜂鸣器响num声
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void Buzzer_BeepThreeTimes(uint8_t num)
{
    uint8_t i;
    static uint32_t Record_send_time = 0;

    for (i = 0; i < num; i++)
    {
        Buzzer_Sound();                     // 蜂鸣器发声
        Record_send_time = RTE_GET_TIMER(); /*记录_开始时间*/
        while (no_timeout == RTE_TIMEOUT_JUDGMENT(Record_send_time, BUZZER_DEL))
        {
        }; // 等待指定的间隔
    }
}

/**
 * @brief 控制LED和蜂鸣器的函数
 * 
 * 该函数根据输入的led_num和buzz_num控制相应的LED灯和蜂鸣器发声。
 * led_num为0时，亮红灯表示测试不合格；led_num为1时，亮绿灯表示测试合格。
 * buzz_num决定了蜂鸣器发出的声音次数。
 * 
 * @param led_num LED编号，用以决定是亮红灯还是绿灯
 * @param buzz_num 蜂鸣器发声次数
 */
void Led_buzz(LED_colour led_num,uint8_t buzz_num)
{
    /* 控制测试不合格指示灯亮红灯 */
    if (LED_RED == led_num)
    {
        RTE_GPIO_PIN_SET_LEVEL(GPIOD,OUT8_PD15_Pin,GPIO_PIN_SET);
        
    } else if(LED_GREEN == led_num) /* 控制测试合格指示灯亮绿灯 */
    {
        RTE_GPIO_PIN_SET_LEVEL(GPIOC,OUT7_PC6_Pin,GPIO_PIN_SET);
    }
    /* 响buzz_num声 */
    RTE_BUZZER_ALARM(buzz_num);
}

void Led_close(LED_colour led_num)
{
    /* 控制测试不合格指示灯亮红灯 */
    if (LED_RED == led_num)
    {
        RTE_GPIO_PIN_SET_LEVEL(GPIOD,OUT8_PD15_Pin,GPIO_PIN_RESET);
        
    } else if(LED_GREEN == led_num) /* 控制测试合格指示灯亮绿灯 */
    {
        RTE_GPIO_PIN_SET_LEVEL(GPIOC,OUT7_PC6_Pin,GPIO_PIN_RESET);
    }
}
